/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ejb;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import jpa.Corsi;
import jpa.Iscrizione;


@Stateless
public class GestioneCorsi implements GestioneCorsiLocal{

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Corsi> listaCorsi() {
        Query query = em.createNamedQuery("Corsi.findAll");
        return query.getResultList();
    }

    @Override
    public boolean registra(Corsi nuovo) {
        Corsi c = controllaCorso(nuovo);
        if(c != null) {
            return false;
        }
        em.persist(nuovo);
        em.flush();
        return true;
    }

    @Override
    public boolean modifica(Corsi vecchio, Corsi nuovo) {
        Corsi c = controllaCorso(vecchio.getId());
        if(c != null){
            if(controllaNomeCorso(nuovo)){
                return false;
            }
            em.merge(nuovo);
            em.flush();
            return true;
        }
        return false;
    }

    private Corsi controllaCorso(Corsi nuovo) {
        Query query = em.createNamedQuery("Corsi.findAll");
        List<Corsi> corsi = query.getResultList();
        if(corsi==null) {
            return null;
        }
        for(Corsi c:corsi){
            if(c.getNome().toUpperCase().equals(nuovo.getNome().toUpperCase())&&c.getSedeid().equals(nuovo.getSedeid())) {
                return c;
            }
        }
        return null;
    }

    private boolean controllaNomeCorso(Corsi nuovo) {
        Query query = em.createNamedQuery("Corsi.findAll");
        List<Corsi> corsi = query.getResultList();
        if(corsi==null) {
            return false;
        }
        for(Corsi c:corsi){
            if(c.getNome().toUpperCase().equals(nuovo.getNome().toUpperCase())&&!(c.getId().equals(nuovo.getId()))) {
                return true;
            }
        }
        return false;
    }

    private Corsi controllaCorso(Integer id) {
        return em.find(Corsi.class, id);
    }

    @Override
    public Corsi getCorso(Integer corsoId) {
        return em.find(Corsi.class, corsoId);
    }

    @Override
    public boolean elimina(Integer corsoId, Integer sedeId) {
        //Mi servono entrambi per stabilire se quel corso si trova in quella sede
        Corsi c = em.find(Corsi.class, corsoId);
        if(c==null) {
            return false;
        }
        if(!c.getSedeid().equals(sedeId)) {
            return false;
        }
        em.remove(c);
        em.flush();
        return true;
    }

    @Override
    public boolean iscrizione(Iscrizione iscrizione) {
        List<Iscrizione> lista = listaIscrizioni(iscrizione.getStudenteid());
        for(Iscrizione i :lista){
            if(i.getCorsiid().equals(iscrizione.getCorsiid())) {
                return false;
            }
        }
        em.persist(iscrizione);
        em.flush();
        return true;
    }

    @Override
    public List<Iscrizione> listaIscrizioni(Integer idStudente) {
        Query query = em.createNamedQuery("Iscrizione.findByStudenteid");
        query.setParameter("studenteid", idStudente);
        return query.getResultList();
    }

}
